-- 2022-8-1

-- 简单IO模型对简单的需求而言还算适用，但对于诸如同时读写对公文件等更高级的文件操作来说就不够了，我们需要使用完整IO模型

-- 可以使用函数io.open来打开一个文件，该函数仿造了C语言在的函数fopen
-- 这个函数由两个参数，一个参数是待打开文件的文件名，另一个参数是一个模式字符串。
--      r 只读
--      w 只写(也可以用来删除文件中原有的内容)
--      a 表示追加
--      b 表示打开二进制文件

-- io.open 返回对应文件的流
-- 发生错误时返回nil的同时返回一条错误信息即一个系统相关的错误码
-- print(io.open("wqeqwde","r"))
--      返回：nil     wqeqwde: No such file or directory      2
-- 检查错误的一种典型的方法是使用函数assert
-- print(assert(io.open("wqeqw","r")))
-- 如果函数执行失败，错误信息将会作为函数assert的第二个参数被传入，之后assert会将错误信息展示出来

-- 打开文件之后，可以使用方法read和write从流中读取和向流中写入，与read和write函数类似，但需要使用冒号运算符将它们当作流对象的方法调用
-- 例如
filepath = ".vscode\\code\\7\\test.lua"
-- local f = assert(io.open(filepath,"r"))
-- local t = f:read("a")
-- print(t)
-- f:close()

-- IO库提供了三个预定义的C语言流句柄：io.stdin,io.stdout,io.stderr
--  例如将信息写到标准错误流中,这样在下面代码报错时会使用我们自定义的错误信息
-- io.stderr:write("hhhhhhhhhhhhhhhhhh")
-- print(assert(io.open("asdq","r")))

-- 函数io.input和io.output允许混用完整IO模型和简单IO模型
-- 调用无参数的io.input()可以获得当前输入流，调用io.input(handle)可以设置当前输入流，io.output也是一样
-- 例如
--      local temp = io.input() -- 保存当前输入流
--      io.input("newinput") -- 打开一个新的输入流
--      进行操作
--      io.input():close -- 关闭当前操作流
--      io.input(temp) -- 恢复此前的当前输入流

-- 注意io.read(args)实际上是io.input():read(args)的简写，即函数read是用在当前输入流上的
-- 同样io.write(args)是io.output():write(args)的简写

-- 此外还可以用io.lines从流中读取内容
-- 如果给lines提供一个文件名，他就会以只读方式打开对应该文件的输入流，并在到达文件末尾后关闭该输入流
-- 若调用时不带参数，函数io.lines就从当前输入流读取
-- 我们也可以把函数当作句柄的一个方法